package com.tbynet.jwp.repository.spi;

import java.util.List;
import java.util.Map;

import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.tbynet.jwp.framework.core._JwpService;
import com.tbynet.jwp.model.Postmeta;
import com.tbynet.jwp.model.Posts;

/**
 * 文章服务接口 - 基于WordPress 4.9功能设计
 * @ClassName: PostService
 * @Description: 负责文章数据的获取、添加、修改、删除功能，完整实现WordPress文章系统功能
 * @Author: 佰亿互联
 * @Date: 2025年11月4日
 *
 * @Copyright: 2025 www.tbynet.com Inc. All rights reserved.
 */
public interface PostService extends _JwpService<Posts> {

    // === 基础CRUD操作 ===

    /**
     * 根据ID和类型获取文章（WordPress的get_post）
     * @param ID 文章ID
     * @param type 文章类型
     * @return 文章对象
     */
    Posts getPost(Object ID, String type);

    /**
     * 根据ID获取文章（包含所有状态）- WordPress的get_post with any status
     * @param ID 文章ID
     * @return 文章对象
     */
    Posts getPostWithAnyStatus(Object ID);

    /**
     * 根据别名获取文章（WordPress的get_page_by_path）
     * @param slug 文章别名
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章对象
     */
    Posts getPostBySlug(String slug, String type, String status);

    /**
     * 创建新文章（WordPress的wp_insert_post）
     * @param post 文章对象
     * @param postmetas 元数据列表
     * @return 创建结果
     */
    boolean createPost(Posts post, List<Postmeta> postmetas);

    /**
     * 更新文章（WordPress的wp_update_post）
     * @param post 文章对象
     * @param postmetas 元数据列表
     * @return 更新结果
     */
    boolean updatePost(Posts post, List<Postmeta> postmetas);

    /**
     * 删除文章（移动到回收站）- WordPress的wp_trash_post
     * @param postId 文章ID
     * @return 删除结果
     */
    boolean trashPost(Object postId);

    /**
     * 永久删除文章 - WordPress的wp_delete_post
     * @param postId 文章ID
     * @return 删除结果
     */
    boolean deletePostPermanently(Object postId);

    /**
     * 从回收站恢复文章 - WordPress的wp_untrash_post
     * @param postId 文章ID
     * @return 恢复结果
     */
    boolean restorePost(Object postId);

    /**
     * 检查文章是否存在
     * @param postId 文章ID
     * @return 是否存在
     */
    boolean exists(Object postId);

    // === 统计操作（WordPress的wp_count_posts等）===

    /**
     * 统计文章数量 - WordPress的wp_count_posts
     * @param status 文章状态
     * @return 文章数量
     */
    int count(String status);

    /**
     * 统计文章数量
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章数量
     */
    int count(String type, String status);

    /**
     * 统计所有文章数量
     * @return 文章数量
     */
    int countAll();

    /**
     * 统计用户文章数量 - WordPress的count_user_posts
     * @param userId 用户ID
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章数量
     */
    int countByUser(Object userId, String type, String status);

    /**
     * 统计置顶文章数量
     * @return 置顶文章数量
     */
    long countStickyPosts();

    /**
     * 根据条件统计文章数量
     * @param type 文章类型
     * @param status 文章状态
     * @param keyword 关键词
     * @param category 分类
     * @param tag 标签
     * @param month 月份
     * @param sticky 是否置顶
     * @return 文章数量
     */
    long countByCondition(String type, String status, String keyword,
                          String category, String tag, String month, Boolean sticky);

    // === 查询操作（WordPress的get_posts, WP_Query等）===

    /**
     * 根据条件分页查询文章 - WordPress的WP_Query功能
     * @param pageNumber 页码
     * @param pageSize 每页大小
     * @param type 文章类型
     * @param status 文章状态
     * @param keyword 关键词
     * @param category 分类
     * @param tag 标签
     * @param month 月份
     * @param sticky 是否置顶
     * @param author 作者ID
     * @param orderBy 排序字段
     * @param order 排序方向
     * @return 分页结果
     */
    Page<Posts> paginate(int pageNumber, int pageSize, String type, String status,
                         String keyword, String category, String tag, String month,
                         Boolean sticky, Integer author, String orderBy, String order);

    /**
     * 获取最新文章 - WordPress的get_posts with 'numberposts'
     * @param limit 数量限制
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getRecentPosts(int limit, String type, String status);

    /**
     * 获取相关文章 - 基于标签和分类的相关性
     * @param postId 当前文章ID
     * @param limit 数量限制
     * @return 相关文章列表
     */
    List<Posts> getRelatedPosts(Object postId, int limit);

    /**
     * 根据分类获取文章 - WordPress的get_posts with 'category'
     * @param categoryId 分类ID
     * @param limit 数量限制
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getPostsByCategory(Object categoryId, int limit, String status);

    /**
     * 根据标签获取文章 - WordPress的get_posts with 'tag'
     * @param tagId 标签ID
     * @param limit 数量限制
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getPostsByTag(Object tagId, int limit, String status);

    /**
     * 根据作者获取文章 - WordPress的get_posts with 'author'
     * @param authorId 作者ID
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getPostsByAuthor(Object authorId, String type, String status);

    /**
     * 根据日期归档获取文章 - WordPress的get_posts with 'year', 'monthnum'
     * @param year 年份
     * @param month 月份
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getPostsByDate(String year, String month, String type, String status);

    /**
     * 根据ID列表获取文章 - WordPress的get_posts with 'post__in'
     * @param postIds 文章ID列表
     * @return 文章列表
     */
    List<Posts> getPostsByIds(List<Integer> postIds);

    /**
     * 根据标题查找文章
     * @param title 文章标题
     * @return 文章对象
     */
    Posts findPostByTitle(String title);

    /**
     * 搜索文章 - WordPress的搜索功能
     * @param keyword 关键词
     * @param type 文章类型
     * @param status 文章状态
     * @param limit 数量限制
     * @return 文章列表
     */
    List<Posts> searchPosts(String keyword, String type, String status, int limit);

    /**
     * 获取所有文章类型 - WordPress的get_post_types
     * @return 文章类型列表
     */
    List<String> getAllPostTypes();

    /**
     * 获取置顶文章 - WordPress的get_option('sticky_posts')
     * @param limit 数量限制
     * @param type 文章类型
     * @param status 文章状态
     * @return 置顶文章列表
     */
    List<Posts> getStickyPosts(int limit, String type, String status);

    /**
     * 获取随机文章 - WordPress的RAND orderby
     * @param limit 数量限制
     * @param type 文章类型
     * @param status 文章状态
     * @return 随机文章列表
     */
    List<Posts> getRandomPosts(int limit, String type, String status);

    // === 元数据操作（WordPress的get_post_meta等）===

    /**
     * 获取文章所有元数据 - WordPress的get_post_meta
     * @param ID 文章ID
     * @return 元数据列表
     */
    List<Postmeta> getPostmetas(Object ID);

    /**
     * 获取文章指定元数据
     * @param ID 文章ID
     * @param metaKeys 元数据键
     * @return 元数据列表
     */
    List<Postmeta> getPostmetas(Object ID, String... metaKeys);

    /**
     * 获取文章单个元数据 - WordPress的get_post_meta with single=true
     * @param ID 文章ID
     * @param metaKey 元数据键
     * @return 元数据对象
     */
    Postmeta getPostmeta(Object ID, String metaKey);

    /**
     * 获取文章元数据值
     * @param ID 文章ID
     * @param metaKey 元数据键
     * @return 元数据值
     */
    String getPostmetaValue(Object ID, String metaKey);

    /**
     * 获取文章元数据值（带默认值）
     * @param ID 文章ID
     * @param metaKey 元数据键
     * @param defaultValue 默认值
     * @return 元数据值
     */
    String getPostmetaValue(Object ID, String metaKey, String defaultValue);

    /**
     * 保存文章元数据 - WordPress的update_post_meta
     * @param postId 文章ID
     * @param postmetas 元数据列表
     * @return 保存结果
     */
    boolean savePostMetas(Object postId, List<Postmeta> postmetas);

    /**
     * 更新文章元数据
     * @param postId 文章ID
     * @param postmetas 元数据列表
     * @return 更新结果
     */
    boolean updatePostMetas(Object postId, List<Postmeta> postmetas);

    /**
     * 添加或更新单个元数据 - WordPress的add_post_meta / update_post_meta
     * @param postId 文章ID
     * @param metaKey 元数据键
     * @param metaValue 元数据值
     * @return 操作结果
     */
    boolean addOrUpdatePostmeta(Object postId, String metaKey, String metaValue);

    /**
     * 删除文章元数据 - WordPress的delete_post_meta
     * @param postId 文章ID
     * @return 删除结果
     */
    boolean deletePostMetas(Object postId);

    /**
     * 删除指定元数据
     * @param postId 文章ID
     * @param metaKey 元数据键
     * @return 删除结果
     */
    boolean deletePostmeta(Object postId, String metaKey);

    /**
     * 检查元数据是否存在 - WordPress的metadata_exists
     * @param postId 文章ID
     * @param metaKey 元数据键
     * @return 是否存在
     */
    boolean postmetaExists(Object postId, String metaKey);

    // === 特殊功能 ===

    /**
     * 获取文章归档列表 - WordPress的wp_get_archives
     * @param type 文章类型
     * @param status 文章状态
     * @param limit 数量限制
     * @return 归档列表
     */
    List<Record> getPostArchives(String type, String status, int limit);

    /**
     * 更新文章评论数量 - WordPress的wp_update_comment_count
     * @param postId 文章ID
     * @param commentCount 评论数量
     * @return 更新结果
     */
    boolean updateCommentCount(Object postId, int commentCount);

    /**
     * 增加文章评论数量
     * @param postId 文章ID
     * @param increment 增量
     * @return 更新结果
     */
    boolean incrementCommentCount(Object postId, int increment);

    /**
     * 更新文章浏览次数
     * @param postId 文章ID
     * @param viewCount 浏览次数
     * @return 更新结果
     */
    boolean updateViewCount(Object postId, int viewCount);

    /**
     * 增加文章浏览次数 - 类似WordPress的post views插件
     * @param postId 文章ID
     * @param increment 增量
     * @return 更新结果
     */
    boolean incrementViewCount(Object postId, int increment);

    /**
     * 设置文章置顶状态 - WordPress的stick_post
     * @param postId 文章ID
     * @param sticky 是否置顶
     * @return 设置结果
     */
    boolean setSticky(Object postId, boolean sticky);

    /**
     * 获取相邻文章（上一篇/下一篇）- WordPress的get_adjacent_post
     * @param postId 当前文章ID
     * @param adjacentType 相邻类型（prev/next）
     * @param type 文章类型
     * @param status 文章状态
     * @return 相邻文章
     */
    Posts getAdjacentPost(Object postId, String adjacentType, String type, String status);

    /**
     * 获取上一篇和下一篇文章
     * @param postId 当前文章ID
     * @param type 文章类型
     * @param status 文章状态
     * @return 包含上一篇和下一篇文章的Map
     */
    Map<String, Posts> getAdjacentPosts(Object postId, String type, String status);

    /**
     * 复制文章 - 类似WordPress的duplicate post插件
     * @param postId 原文章ID
     * @param newTitle 新文章标题
     * @param status 新文章状态
     * @return 新文章ID
     */
    Object duplicatePost(Object postId, String newTitle, String status);

    /**
     * 批量更新文章状态 - WordPress的批量操作
     * @param postIds 文章ID列表
     * @param status 新状态
     * @return 更新结果
     */
    boolean batchUpdateStatus(List<Object> postIds, String status);

    /**
     * 批量删除文章
     * @param postIds 文章ID列表
     * @param permanent 是否永久删除
     * @return 删除结果
     */
    boolean batchDeletePosts(List<Object> postIds, boolean permanent);

    /**
     * 批量设置文章分类 - WordPress的wp_set_post_categories
     * @param postIds 文章ID列表
     * @param categoryIds 分类ID列表
     * @return 设置结果
     */
    boolean batchSetCategories(List<Object> postIds, List<Object> categoryIds);

    /**
     * 批量设置文章标签 - WordPress的wp_set_post_tags
     * @param postIds 文章ID列表
     * @param tagIds 标签ID列表
     * @return 设置结果
     */
    boolean batchSetTags(List<Object> postIds, List<Object> tagIds);

    /**
     * 更改文章作者 - WordPress的wp_update_post
     * @param postIds 文章ID列表
     * @param newAuthorId 新作者ID
     * @return 更改结果
     */
    boolean changeAuthor(List<Object> postIds, Object newAuthorId);

    /**
     * 获取文章状态列表 - WordPress的get_post_statuses
     * @return 状态列表
     */
    List<String> getPostStatuses();

    /**
     * 获取文章类型的状态统计 - WordPress的wp_count_posts per type
     * @return 统计结果
     */
    Map<String, Map<String, Integer>> getPostTypeStatusCounts();

    /**
     * 验证文章数据 - WordPress的post validation
     * @param post 文章对象
     * @return 验证结果
     */
    boolean validatePost(Posts post);

    /**
     * 生成唯一的文章别名 - WordPress的wp_unique_post_slug
     * @param title 文章标题
     * @param postId 文章ID（用于排除自身）
     * @return 唯一别名
     */
    String generateUniqueSlug(String title, Object postId);

    /**
     * 检查别名是否唯一
     * @param slug 别名
     * @param postId 文章ID（用于排除自身）
     * @return 是否唯一
     */
    boolean isSlugUnique(String slug, Object postId);

    // === 修订版本功能（WordPress的Post Revisions）===

    /**
     * 获取文章修订版本 - WordPress的wp_get_post_revisions
     * @param postId 文章ID
     * @return 修订版本列表
     */
    List<Posts> getPostRevisions(Object postId);

    /**
     * 恢复文章到指定修订版本 - WordPress的wp_restore_post_revision
     * @param postId 文章ID
     * @param revisionId 修订版本ID
     * @return 恢复结果
     */
    boolean restoreRevision(Object postId, Object revisionId);

    /**
     * 清理过期的文章修订版本 - WordPress的wp_delete_post_revision
     * @param days 保留天数
     * @return 清理数量
     */
    int cleanOldRevisions(int days);

    // === 附件管理功能 ===

    /**
     * 获取文章附件 - WordPress的get_children with post_type=attachment
     * @param postId 文章ID
     * @return 附件列表
     */
    List<Posts> getPostAttachments(Object postId);

    /**
     * 获取文章的特色图片 - WordPress的get_post_thumbnail_id
     * @param postId 文章ID
     * @return 特色图片ID
     */
    Object getFeaturedImage(Object postId);

    /**
     * 设置文章的特色图片 - WordPress的set_post_thumbnail
     * @param postId 文章ID
     * @param attachmentId 附件ID
     * @return 设置结果
     */
    boolean setFeaturedImage(Object postId, Object attachmentId);

    /**
     * 删除文章的特色图片 - WordPress的delete_post_thumbnail
     * @param postId 文章ID
     * @return 删除结果
     */
    boolean deleteFeaturedImage(Object postId);

    // === 密码保护功能 ===

    /**
     * 获取文章密码状态 - WordPress的post_password_required
     * @param postId 文章ID
     * @return 是否有密码
     */
    boolean isPasswordProtected(Object postId);

    /**
     * 验证文章密码 - WordPress的check_password
     * @param postId 文章ID
     * @param password 密码
     * @return 验证结果
     */
    boolean verifyPostPassword(Object postId, String password);

    // === 内容处理功能 ===

    /**
     * 获取文章摘要 - WordPress的get_the_excerpt
     * @param postId 文章ID
     * @param length 摘要长度
     * @return 文章摘要
     */
    String getPostExcerpt(Object postId, int length);

    /**
     * 生成文章摘要 - WordPress的wp_trim_excerpt
     * @param content 文章内容
     * @param length 摘要长度
     * @return 生成的摘要
     */
    String generateExcerpt(String content, int length);

    /**
     * 获取文章阅读时间（估算）- 类似阅读时间插件
     * @param postId 文章ID
     * @return 阅读时间（分钟）
     */
    int getReadingTime(Object postId);

    /**
     * 获取文章内容中的图片 - 用于特色图片自动提取
     * @param postId 文章ID
     * @return 图片URL列表
     */
    List<String> getContentImages(Object postId);

    // === 高级查询功能 ===

    /**
     * 根据自定义字段查询文章 - WordPress的meta_query
     * @param metaKey 元数据键
     * @param metaValue 元数据值
     * @param compare 比较操作符 (=, !=, >, <, LIKE等)
     * @param type 文章类型
     * @param status 文章状态
     * @return 文章列表
     */
    List<Posts> getPostsByMeta(String metaKey, String metaValue, String compare,
                               String type, String status);

    /**
     * 获取父子关系的页面 - WordPress的get_pages with child_of
     * @param parentId 父页面ID
     * @param status 页面状态
     * @return 子页面列表
     */
    List<Posts> getChildPages(Object parentId, String status);

    /**
     * 获取菜单项文章 - 用于导航菜单
     * @param menuId 菜单ID
     * @return 菜单项文章列表
     */
    List<Posts> getMenuItems(Object menuId);

    // === 缓存相关功能 ===

    /**
     * 清理文章缓存 - 用于缓存更新
     * @param postId 文章ID
     */
    void clearPostCache(Object postId);

    /**
     * 批量清理文章缓存
     * @param postIds 文章ID列表
     */
    void batchClearPostCache(List<Object> postIds);

    // === 导入导出功能 ===

    /**
     * 导出文章数据
     * @param postIds 文章ID列表
     * @return 导出数据
     */
    String exportPosts(List<Object> postIds);

    /**
     * 导入文章数据
     * @param importData 导入数据
     * @param authorId 默认作者ID
     * @return 导入结果
     */
    boolean importPosts(String importData, Object authorId);
}